home *** CD-ROM | disk | FTP | other *** search
/ Aminet 30 / Aminet 30 (1999)(Schatztruhe)[!][Apr 1999].iso / Aminet / gfx / misc / gnuplot-3.7src.lha / gnuplot-3.7src / gnuplot-3.7.lha / gnuplot-3.7 / term / pc.trm < prev    next >
Text File  |  1998-12-14  |  14KB  |  550 lines

  1. /*
  2.  * $Id: pc.trm,v 1.20 1998/06/18 14:59:22 ddenholm Exp $
  3.  *
  4.  */
  5.  
  6. /* GNUPLOT - pc.trm */
  7.  
  8. /*[
  9.  * Copyright 1990 - 1993, 1998
  10.  *
  11.  * Permission to use, copy, and distribute this software and its
  12.  * documentation for any purpose with or without fee is hereby granted,
  13.  * provided that the above copyright notice appear in all copies and
  14.  * that both that copyright notice and this permission notice appear
  15.  * in supporting documentation.
  16.  *
  17.  * Permission to modify the software is granted, but not the right to
  18.  * distribute the complete modified source code.  Modifications are to
  19.  * be distributed as patches to the released version.  Permission to
  20.  * distribute binaries produced by compiling modified sources is granted,
  21.  * provided you
  22.  *   1. distribute the corresponding source modifications from the
  23.  *    released version in the form of a patch file along with the binaries,
  24.  *   2. add special version identification to distinguish your version
  25.  *    in addition to the base release version number,
  26.  *   3. provide your name and address as the primary contact for the
  27.  *    support of your modified version, and
  28.  *   4. retain our contact information in regard to use of the base
  29.  *    software.
  30.  * Permission to distribute the released version of the source code along
  31.  * with corresponding source modifications in the form of a patch file is
  32.  * granted with same provisions 2 through 4 for binary distributions.
  33.  *
  34.  * This software is provided "as is" without express or implied warranty
  35.  * to the extent permitted by applicable law.
  36. ]*/
  37.  
  38. /*
  39.  * This file is included by ../term.c.
  40.  *
  41.  * This terminal driver supports:
  42.  *  Under Microsoft C
  43.  *      cga, egabios, egalib, vgabios, hercules, corona325, att
  44.  *  Under Turboc C
  45.  *      cga, ega/vga, vgamono, svga, mcga, hercules, att
  46.  *  Under Watcom C
  47.  *      cga, ega/vga, vgamono, svga, mcga, hercules, ???
  48.  *
  49.  * AUTHORS
  50.  *  Colin Kelley, Thomas Williams, William Wilson, Russell Lang
  51.  *  modified by David J. Liu (liu@csb.yale.edu) for version 3.6
  52.  *
  53.  * send your comments or suggestions to (info-gnuplot@dartmouth.edu).
  54.  *
  55.  * Because only one compiler is used to generate gnuplot.exe
  56.  * and the type of the single graphics board is auto-detected,
  57.  * we can combine all these parts into one terminal type: PC
  58.  * and let the computer take care of the rest.  -- DJL
  59.  *
  60.  * Since I don't have MicroSoft C, I assume it would define MSC.
  61.  * Please correct it if you are using MS C.  Thank you.  -- DJL
  62.  *
  63.  */
  64.  
  65. /*
  66.  * adapted to the new terminal layout by Stefan Bodewig (Dec. 1995)
  67.  */
  68.  
  69. #include "driver.h"
  70.  
  71. #ifdef TERM_REGISTER
  72. register_term(dospc)
  73. #endif
  74.  
  75. #ifdef TERM_PROTO
  76. TERM_PUBLIC void PC_text __PROTO((void));
  77. TERM_PUBLIC void PC_reset __PROTO((void));
  78. TERM_PUBLIC void PC_init __PROTO((void));
  79. TERM_PUBLIC void PC_graphics __PROTO((void));
  80. TERM_PUBLIC void PC_linetype __PROTO((int linetype));
  81. TERM_PUBLIC void PC_move __PROTO((int x, int y));
  82. TERM_PUBLIC void PC_vector __PROTO((int x, int y));
  83. TERM_PUBLIC void PC_put_text __PROTO((int x, int y, char *str));
  84. TERM_PUBLIC int PC_text_angle __PROTO((int ang));
  85. TERM_PUBLIC int PC_justify_text __PROTO((enum JUSTIFY ang));
  86.  
  87. #define PC_HCHAR FNT5X9_HCHAR
  88. #define PC_VCHAR FNT5X9_VCHAR
  89. #define PC_HTIC 5
  90. #define PC_VTIC 4
  91. #define PC_XMAX 100        /* These two entries are just place holders. */
  92. #define PC_YMAX 100        /* The actual values will be found in init.  */
  93. #endif /* TERM_PROTO */
  94.  
  95. #ifndef TERM_PROTO_ONLY
  96. #ifdef TERM_BODY
  97.  
  98. #ifdef __TURBOC__
  99. static int huge detect_svga __PROTO((void));
  100. #endif /* __TURBOC__ */
  101.  
  102. #include <string.h>
  103. #include <stdlib.h>
  104. #ifdef __TURBOC__
  105. #include <graphics.h>
  106. #include <conio.h>
  107. #include <dos.h>
  108. #endif /* __TURBOC__ */
  109. #ifdef __WATCOMC__
  110. #include <graph.h>
  111. #endif /* WATCOMC */
  112. #ifdef MSC
  113. #include "mcega.h"
  114. #endif /* MSC */
  115.  
  116. static int pattern[] ={ 0xffff, 0x0f0f, 0xffff, 0xaaaa, 0x3333, 0x3f3f, 0x0f0f };
  117. static int vga_color[] ={ 7, 8, 2, 3, 4, 5, 9, 14, 12, 15, 13, 10, 11, 1, 6 };
  118.  
  119. static int pc_driver, pc_mode;
  120. static int graphics_on = FALSE, pc_graphics = FALSE;
  121. static int startx, starty, pc_lastx, pc_lasty, pc_colors;
  122. static int pc_angle, pc_hjustify, pc_vjustify, pc_text_size, pc_text_dir, pc_corscreen = -1;
  123.  
  124.  
  125. #ifdef __TURBOC__
  126. extern int far _Cdecl SVGA_driver_far[];
  127. #endif /* __TURBOC__ */
  128.  
  129. #ifdef __WATCOMC__
  130. enum {
  131.     HORIZ_DIR, VERT_DIR
  132. };
  133. static void _settextang(ang)
  134. int ang;
  135. {
  136.     if (ang == HORIZ_DIR) {
  137.     _settextorient(1, 0);
  138.     } else {
  139.     _settextorient(0, 1);
  140.     }
  141. }
  142. #endif /* WATCOMC */
  143.  
  144. static int huge detect_svga(void)
  145. {
  146.     return 0;            /* the default mode, just a place holder */
  147. }
  148.  
  149. void PC_setup()
  150. {                /* called from the beginning of main() */
  151.     int i, t, x, y;
  152.     char pc_modename[9];
  153. #ifdef __WATCOMC__
  154.     struct videoconfig VC;
  155. #endif /* WATCOMC */
  156.  
  157.     /* First link all BRI dribers, then detect the display card. */
  158.     /* If environment PCTRM is set, try initiate the card/mode.  */
  159.  
  160.     /* special instruction on mode */
  161.     safe_strncpy(pc_modename, getenv("PCTRM"), 8);
  162.  
  163. #ifdef __TURBOC__
  164.     /* Some of this code including BGI drivers are copyright Borland Intl. */
  165.     registerfarbgidriver(EGAVGA_driver_far);
  166.     registerfarbgidriver(CGA_driver_far);
  167.     registerfarbgidriver(Herc_driver_far);
  168.     registerfarbgidriver(ATT_driver_far);
  169.     registerfarbgidriver(PC3270_driver_far);
  170.     pc_driver = DETECT;
  171.     detectgraph(&pc_driver, &pc_mode);
  172.     if (graphresult()) {
  173.     fputs("Unable to initialize graphics.\n", stderr);
  174.     return;
  175.     }
  176. #ifdef BGI_NAME
  177. /* the highest standard pc_driver value, see graphics.h */
  178. #define LAST_BGI 10
  179. /* the last mode of the SVGA.BGI */
  180. #define LAST_SVGA_MODE 6
  181.     /* test SVGA if we have VGA */
  182.     if ((pc_driver == VGA) && (pc_modename[0] == 'S')) {
  183.     installuserdriver(BGI_NAME, &detect_svga);
  184.     registerfarbgidriver(SVGA_driver_far);
  185.     pc_driver = DETECT;
  186.     initgraph(&pc_driver, &pc_mode, "");
  187.         /* The following code, which is independent of the actual SVGA.BGI
  188.      * used, tries to find a mode of width defined in the environment
  189.      * variable PCTRM */
  190.     if (pc_driver > LAST_BGI) {    /* success */
  191.         sscanf(pc_modename, "S%d", &t);
  192.         switch (t) {
  193.         case 800:
  194.         break;        /* S800  */
  195.         case 1024:
  196.         break;        /* S1024 */
  197.         case 1280:
  198.         break;        /* S1280 */
  199.         default:
  200.         t = 640;    /* 640x480 */
  201.         }
  202.         for (i = 0; i <= LAST_SVGA_MODE; i++) {
  203.         setgraphmode(i);
  204.         if ((getmaxx() + 1 == t) && (getmaxcolor() > 14))
  205.             pc_mode = i;
  206.         }
  207.         setgraphmode(pc_mode);
  208.         if (graphresult()) {    /* error, go back to VGA */
  209.         pc_driver = VGA;
  210.         pc_mode = 4;
  211.         }
  212.     }
  213.     }                /* SVGA tested */
  214.     if (pc_driver <= LAST_BGI)
  215. #endif /* BGI_NAME */
  216.     initgraph(&pc_driver, &pc_mode, "");
  217.     pc_colors = getmaxcolor() + 1;
  218.     pc_lastx = getmaxx();
  219.     pc_lasty = getmaxy();
  220.     restorecrtmode();
  221.     clrscr();
  222. #endif /* __TURBOC__ */
  223. #ifdef __WATCOMC__
  224.     _getvideoconfig(&VC);
  225.     if ((pc_driver = VC.adapter) == 0) {
  226.     fprintf(stderr, "Unable to initialize graphics.\n");
  227.     return;
  228.     }
  229.     switch (pc_driver = VC.adapter) {
  230.     case _HERCULES:
  231.     pc_mode = _HERCMONO;
  232.     break;
  233.     case _CGA:
  234.     pc_mode = _HRESBW;
  235.     break;
  236.     case _MCGA:
  237.     pc_mode = _MRES256COLOR;
  238.     break;
  239.     case _EGA:
  240.     pc_mode = (VC.monitor == _MONO ? _ERESCOLOR : _ERESNOCOLOR);
  241.     break;
  242.     case _VGA:
  243.     pc_mode = _VRES16COLOR;
  244.     break;
  245.     case _SVGA:
  246.     if (pc_modename[0] == 'S') {    /* test SVGA resolution */
  247.         sscanf(pc_modename, "S%d", &t);
  248.         switch (t) {
  249.         case 800:
  250.         pc_mode = _SVRES256COLOR;
  251.         break;        /* S800  */
  252.         case 1024:
  253.         pc_mode = _XRES256COLOR;
  254.         break;        /* S1024 */
  255.         case 1280:
  256.         pc_mode = _XRES256COLOR + 2;
  257.         break;        /* S1280 */
  258.         /* Someone help me, who knows, how a newer Watcom calls that */
  259.         default:
  260.         t = 640;
  261.         pc_mode = _VRES256COLOR;    /* 640x480 */
  262.         }
  263.         while (_setvideomode(pc_mode) == 0)
  264.         pc_mode--;
  265.     }
  266.     break;
  267.     default:
  268.     fputs("Unable to initialize graphics.\n", stderr);
  269.     return;
  270.     }
  271.     _setvideomode(pc_mode);
  272.     _getvideoconfig(&VC);
  273.     pc_lastx = VC.numxpixels - 1;
  274.     pc_lasty = VC.numypixels - 1;
  275.     pc_colors = VC.numcolors;
  276.     _setvideomode(_DEFAULTMODE);
  277. #endif /* WATCOMC */
  278.     x = pc_lastx + 1;
  279.     y = pc_lasty + 1;
  280.     fprintf(stderr, "\tScreen of %d x %d pixels and %d colors.\n",
  281.         x, y, pc_colors);
  282.     pc_graphics = TRUE;
  283. }
  284.  
  285. TERM_PUBLIC void PC_init()
  286. {
  287.     char *pathp;
  288. #ifdef __WATCOMC__
  289.     struct _fontinfo fi;
  290. #endif
  291.  
  292.     if (!pc_graphics) {
  293.     fputs("Unable to initialize graphics.\n", stderr);
  294.     term = 0;
  295.     return;
  296.     }
  297.     /* Double the tic/font sizes. */
  298.     pc_text_size = (pc_lasty > 590) ? 2 : 1;
  299.     term->h_char = PC_HCHAR;
  300.     term->v_char = PC_VCHAR;
  301.     term->h_tic = PC_HTIC * pc_text_size;
  302.     term->v_tic = PC_VTIC * pc_text_size;
  303.     term->xmax = pc_lastx + 1;
  304.     term->ymax = pc_lasty + 1;
  305. #ifdef __TURBOC__
  306.     setgraphmode(pc_mode);
  307.     settextstyle(DEFAULT_FONT, HORIZ_DIR, pc_text_size);
  308.     settextjustify(pc_hjustify, pc_vjustify);
  309.     term->h_char = textheight("X");    /* overriding the default */
  310.     term->v_char = textwidth("X");    /* overriding the default */
  311. #endif /* __TURBOC__ */
  312. #ifdef __WATCOMC__
  313.     _setvideomode(pc_mode);
  314.     _settextang(HORIZ_DIR);
  315.     _settextalign(pc_hjustify, pc_vjustify);
  316.     _setcharsize(pc_text_size * PC_HCHAR, pc_text_size * PC_VCHAR);
  317.     _getfontinfo(&fi);
  318.     term->h_char = fi.avgwidth;
  319.     term->v_char = fi.pixheight * 1.5;
  320. #endif /* WATCOMC */
  321. #ifdef MSC
  322. #endif /* MSC */
  323. }
  324.  
  325. TERM_PUBLIC void PC_graphics()
  326. {
  327.     graphics_on = TRUE;
  328. #ifdef __TURBOC__
  329.     setgraphmode(pc_mode);
  330. #endif /* __TURBOC__ */
  331. #ifdef __WATCOMC__
  332.     _setvideomode(pc_mode);
  333. #endif /* WATCOMC */
  334. #ifdef MSC
  335.     if (pc_corscreen == -1)
  336.     Vmode(18);        /* VGA */
  337.     else {
  338.     grinit(corscreen);
  339.     grandtx();
  340.     }                /* corolla */
  341. #endif /* MSC */
  342. }
  343.  
  344. TERM_PUBLIC void PC_linetype(linetype)
  345. {
  346.     if (pc_colors > 14) {    /* 16 or more colors */
  347.     if (linetype >= 13)
  348.         linetype %= 13;
  349. #ifdef __TURBOC__
  350.     setcolor(vga_color[linetype + 2]);
  351. #endif /* __TURBOC__ */
  352. #ifdef __WATCOMC__
  353.     _setcolor(vga_color[linetype + 2]);
  354. #endif /* WATCOMC */
  355. #ifdef MSC
  356. #endif /* MSC */
  357.     } else {            /* MONO */
  358.     if (linetype >= 5)
  359.         linetype %= 5;
  360. #ifdef __TURBOC__
  361.     setlinestyle(4, pattern[linetype + 2], 1);
  362. #endif /* __TURBOC__ */
  363. #ifdef __WATCOMC__
  364.     _setlinestyle(pattern[linetype + 2]);
  365. #endif /* WATCOMC */
  366. #ifdef MSC
  367.     if (pc_corscreen != -1)
  368.         Cor_mask(pattern[linetype + 2]);
  369. #endif /* MSC */
  370.     }
  371. }
  372.  
  373. TERM_PUBLIC void PC_move(x, y)
  374. int x, y;
  375. {
  376. #ifdef __TURBOC__
  377.     moveto(x, pc_lasty - y);
  378. #endif /* __TURBOC__ */
  379. #ifdef __WATCOMC__
  380.     _moveto(x, pc_lasty - y);
  381. #endif /* WATCOMC */
  382. #ifdef MSC
  383. #endif /* MSC */
  384.     startx = x;
  385.     starty = y;
  386. }
  387.  
  388. TERM_PUBLIC void PC_vector(x, y)
  389. int x, y;
  390. {
  391. #ifdef __TURBOC__
  392.     lineto(x, pc_lasty - y);
  393. #endif /* __TURBOC__ */
  394. #ifdef __WATCOMC__
  395.     _lineto(x, pc_lasty - y);
  396. #endif /* WATCOMC */
  397. #ifdef MSC
  398.     if (pc_corscreen != -1)
  399.     Cor_line(startx, COR_YLAST - starty, x, COR_YLAST - y);
  400. #endif /* MSC */
  401.     startx = x;
  402.     starty = y;
  403. }
  404.  
  405. TERM_PUBLIC void PC_reset()
  406. {
  407.     graphics_on = FALSE;
  408. #ifdef __TURBOC__
  409.     restorecrtmode();
  410.     clrscr();
  411. #endif /* __TURBOC__ */
  412. #ifdef __WATCOMC__
  413.     _setvideomode(_DEFAULTMODE);
  414. #endif /* WATCOMC */
  415. #ifdef MSC
  416.     Vmode(3);
  417. #endif /* MSC */
  418. }
  419.  
  420. TERM_PUBLIC void PC_text()
  421. {
  422.     if (graphics_on) {
  423.     graphics_on = FALSE;
  424.     (void) getch();
  425. #ifdef __TURBOC__
  426.     restorecrtmode();
  427.     clrscr();
  428. #endif /* __TURBOC__ */
  429. #ifdef __WATCOMC__
  430.     _setvideomode(_DEFAULTMODE);
  431. #endif /* WATCOMC */
  432. #ifdef MSC
  433.     if (pc_corscreen != -1) {
  434.         grreset();
  435.         txonly();
  436.     }
  437.     Vmode(3);
  438. #endif /* MSC */
  439.     }
  440. }
  441.  
  442. TERM_PUBLIC int PC_text_angle(ang)
  443. int ang;
  444. {
  445.     switch (ang) {
  446.     case 0:
  447.     pc_text_dir = HORIZ_DIR;
  448.     break;
  449.     case 1:
  450.     pc_text_dir = VERT_DIR;
  451.     break;
  452.     }
  453.     return TRUE;
  454. }
  455.  
  456. TERM_PUBLIC int PC_justify_text(just)
  457. enum JUSTIFY just;
  458. {
  459. #if defined(__TURBOC__)
  460.     switch (just) {
  461.     case LEFT:
  462.     pc_hjustify = LEFT_TEXT;
  463.     pc_vjustify = CENTER_TEXT;
  464.     break;
  465.     case CENTRE:
  466.     pc_hjustify = CENTER_TEXT;
  467.     pc_vjustify = CENTER_TEXT;
  468.     break;
  469.     case RIGHT:
  470.     pc_hjustify = RIGHT_TEXT;
  471.     pc_vjustify = CENTER_TEXT;
  472.     break;
  473.     }
  474.     settextjustify(pc_hjustify, pc_vjustify);
  475.     return 1;
  476. #elif defined(__WATCOMC__)
  477.     switch (just) {
  478.     case LEFT:
  479.     pc_hjustify = _LEFT;
  480.     pc_vjustify = _HALF;
  481.     break;
  482.     case CENTRE:
  483.     pc_hjustify = _CENTER;
  484.     pc_vjustify = _HALF;
  485.     break;
  486.     case RIGHT:
  487.     pc_hjustify = _RIGHT;
  488.     pc_vjustify = _HALF;
  489.     break;
  490.     }
  491.     _settextalign(pc_hjustify, pc_vjustify);
  492.     return 1;
  493. #else
  494.     return (just == LEFT);
  495. #endif
  496. }
  497.  
  498. TERM_PUBLIC void PC_put_text(x, y, str)
  499. int x, y;
  500. char *str;
  501. {
  502. #ifdef __TURBOC__
  503.     settextstyle(DEFAULT_FONT, pc_text_dir, pc_text_size);
  504.     settextjustify(pc_hjustify, pc_vjustify);
  505.     outtextxy(x, pc_lasty - y, str);
  506. #endif /* __TURBOC__ */
  507. #ifdef __WATCOMC__
  508.     _setcharsize(pc_text_size * PC_VCHAR, pc_text_size * PC_HCHAR);
  509.     _settextang(pc_text_dir);
  510.     _settextalign(pc_hjustify, pc_vjustify);
  511.     _grtext(x, pc_lasty - y, str);
  512. #endif /* WATCOMC */
  513. #ifdef MSC
  514. #endif /* MSC */
  515. }
  516.  
  517. #endif /* TERM_BODY */
  518.  
  519. #ifdef TERM_TABLE
  520.  
  521. TERM_TABLE_START(dospc_driver)
  522.     "dospc", "IBM PC/Clone running DOS",
  523.     PC_XMAX, PC_YMAX, PC_VCHAR, PC_HCHAR,
  524.     PC_VTIC, PC_HTIC, options_null, PC_init, PC_reset,
  525.     PC_text, null_scale, PC_graphics, PC_move, PC_vector,
  526.     PC_linetype, PC_put_text, PC_text_angle,
  527.     PC_justify_text, line_and_point, do_arrow, set_font_null
  528. TERM_TABLE_END(pc_driver)
  529.  
  530. #undef LAST_TERM
  531. #define LAST_TERM dospc_driver
  532.  
  533. #endif /* TERM_TABLE */
  534. #endif /* TERM_PROTO_ONLY */
  535.  
  536. #ifdef TERM_HELP
  537. START_HELP(dospc)
  538. "1 dospc",
  539. "?commands set terminal dospc",
  540. "?set terminal dospc",
  541. "?set term dospc",
  542. "?terminal dospc",
  543. "?term dospc",
  544. "?dospc",
  545. " The `dospc` terminal driver supports PCs with arbitrary graphics boards, which",
  546. " will be automatically detected.  It should be used only if you are not using",
  547. " the gcc or Zortec C/C++ compilers."
  548. END_HELP(dospc)
  549. #endif /* TERM_HELP */
  550.